﻿//条件变量

#include <iostream>
using namespace std;

#include <thread>//线程
#include<mutex>//互斥锁
#include<condition_variable>//条件变量

#include<queue>

#include <string>

queue<int> g_queue;
condition_variable g_cv;//创建条件变量
mutex mtx;

//生产者
void Producer()
{
	for (int i = 0; i < 10; i++)
	{
		{
			unique_lock<mutex> lock(mtx);//析构时自动释放，要弄成局部变量
			g_queue.push(i);
			//通知过来去取
			g_cv.notify_one();
			cout << "Producer : " << i << endl;
		}
		
		this_thread::sleep_for(chrono::milliseconds(500));//休眠500ms
	}
}
//消费者
void Consumer()
{
	while (1)
	{
		unique_lock<mutex> lock(mtx);
		//如果队列为空，就要等待
		//对应的锁、判断方法
		g_cv.wait(lock, []() {
			return  !g_queue.empty();
			});
		

		int value = g_queue.front();
		g_queue.pop();
		cout << "Consumer" << value << endl;
	}
}

int main(void)
{
	thread t1(Producer);
	
	thread t2(Consumer);
	t2.join();
	t1.join();

	return 0;
}